﻿
function Car() {
    // 车参数
    var canvas = document.getElementById('car');
    var carCxt = canvas.getContext('2d'); // 绘图环境
    var name = "Jetta"
    var wa = 186; // 车全宽, 包括后镜宽度
    var w = 176; // 车宽，不含后镱
    this.halfWa = wa / 2; // 半全宽
    var halfW = w / 2; // 半车身宽
    var l1 = 108; // 后轴到车尾的距离
    var l2 = 247; // 轴距
    var l = 442; // 全长
    this.anglez = 0; -degree90; // 车身角度 -90度
    //this.sin = Math.sin(this.anglez);
    //this.cos = Math.cos(this.anglez);
    this.wheelAngle = 0; // 车轮角度
    var wheelW = 19; 	// 车轮宽度
    var wheelR = 30; 	// 车轮半径
    var minR = 525; // 最小转弯半径
    this.speed = 0; //速度 厘米/秒
    this.turn0 = false; // 回正方向
    this.driverX = 106; //124; // 驾驶员眼睛位置X
    this.driverY = 34; // 驾驶员眼睛位置Y
    this.driverZ = 116; // 驾驶员眼睛位置距地面高度
    var l3 = 231; // 后轴到前风挡下沿的水平距离
    this.h1 = 95; // 前风挡下沿到地面的距离
    this.x = 800; // 车位置x，后轴中点相对于场地;
    this.y = -300; //-halfW; // 350; // 车位置y，后轴中点相对于场地;

    this.x0 = this.x;   // 记录汽车原始位置
    this.y0 = this.y;
    this.anglez0 = this.anglez; // 车身原始角度
    this.showCar = true;        // true时俯视图中全时显示车，否则，如果静止显示车，运行时不显示车。

    var me = this;

    // 车运动，用setTransform方法。
    // 移动到x,y，缩放scale，旋转a角度 setTransform( scale*cos(a), scale*sin(a), -scale*sin(a), scale*x, scale*y )
    function draw() {
        // 清除原画面
        carCxt.clearRect(-l1 - 10, -me.halfWa, l + 20, wa); // 加大一些清除范围，避免个别象素擦不掉

        if ((me.turn !== 0 || me.speed !== 0) && !me.showCar) // 运行中不显示车
            return;

        //** g14 自带webkit浏览器中, 有时Math.sin(0) = 0.32, 而Math.sin( 0.000000001 )正常, 因此把0变成0.000000001
        if ( me.anglez === 0 )
            me.anglez = 0.000000001;

        // 建立变换矩阵
        var sin = Math.sin(me.anglez) * topScene.sca; // 纵横比一致
        var cos = Math.cos(me.anglez) * topScene.sca;
        var xx = (me.x + topScene.x0) * topScene.sca	// 水平方向位置
        var yy = (me.y + topScene.y0) * topScene.sca; // 垂直方向位置
        // 矩阵变换，只对以后画的图有作用，以前画的图不动。
        // setTransform( scale*cos(a), scale*sin(a), -scale*sin(a), scale*x, scale*y )
        carCxt.setTransform(cos, sin, -sin, cos, xx, yy);

        //$("#hidecar").html((Math.sin(me.anglez)).toFixed(2) + ", " + (Math.sin(0.000001)).toFixed(2) + ", " + sin.toFixed(2) + ", " + cos.toFixed(2));

        // 画车
        carCxt.drawImage(image, -l1, -me.halfWa, l, wa); // 后轴中心为原点

        // 标记原点和驾驶员位置
        carCxt.beginPath();
        carCxt.moveTo(-wheelW / 2, 0);
        carCxt.lineTo(wheelW / 2, 0);
        carCxt.moveTo(me.driverX - wheelW / 2, -me.driverY);
        carCxt.lineTo(me.driverX + wheelW / 2, -me.driverY);
        // 画车轮
        carCxt.moveTo(wheelx1, wheely1);
        carCxt.lineTo(wheelx2, wheely1);
        carCxt.moveTo(wheelx1, wheely2);
        carCxt.lineTo(wheelx2, wheely2);
        // 前轮角度
        xx = wheelR * Math.cos(me.wheelAngle);
        yy = wheelR * Math.sin(me.wheelAngle);
        carCxt.moveTo(wheelx3 + xx, wheely1 + yy);
        carCxt.lineTo(wheelx3 - xx, wheely1 - yy);
        carCxt.moveTo(wheelx3 + xx, wheely2 + yy);
        carCxt.lineTo(wheelx3 - xx, wheely2 - yy);
        carCxt.stroke();
        //carCxt.clip();


        // 画转弯圆心位置
        /*if (me.wheelAngle !== 0) {
        //lineWidth = 1; // 画布中的车轮宽度
        //me.strokeStyle = 'rgba(255,255,2555,1)'; // 画布中的车轮颜色
        var l = l2 / Math.tan(me.wheelAngle);
        carCxt.beginPath();
        carCxt.moveTo(-10, l);
        carCxt.lineTo(10, l);
        carCxt.moveTo(0, l - 10);
        carCxt.lineTo(0, l + 10);
        carCxt.stroke();
        }*/
    }

    var image = new Image();
    image.src = "images/car.png";
    image.onload = function () {
        draw();
    }

    this.turn = 0; // 转弯状态, 0保持当前状态，1向右打方向，-1向左打方向。
    this.turn0 = false; // 为真时回正方向

    // 车轮参数
    carCxt.lineWidth = wheelW; // 画布中的车轮宽度
    carCxt.strokeStyle = 'rgba(0,0,0,0.6)'; // 画布中的车轮颜色
    //carCxt.lineCap = "round";	// 线头样式为圆形

    var wheely1 = -halfW + wheelW; // 求近似车轮位置
    var wheely2 = halfW - wheelW;
    var wheelx1 = -wheelR;
    var wheelx2 = wheelR;
    var wheelx3 = l2; // 前轮中点，方向通过计算得到。

    // 计算新位置
    this.move = function () {
        // 回正方向盘
        if (this.turn0) {
            if (this.wheelAngle > 0) {
                this.wheelAngle -= radianframe;	// 回正方向
                if (this.whellAgle < 0)
                    this.whellAgle == 0;
            }
            else if (this.wheelAngle < 0) {
                this.wheelAngle += radianframe;
                if (this.whellAgle > 0)
                    this.whellAgle == 0;
            }
        }
        // 转动方向盘
        else if (this.turn !== 0) {
            this.wheelAngle += this.turn;
            if (this.wheelAngle > radianmax)	// 约38度
            {
                this.wheelAngle = radianmax;
            }
            if (this.wheelAngle < -radianmax) {
                this.wheelAngle = -radianmax;
            }

            //this.anglez += this.turn;
        }

        // 计算车位置
        if (this.speed !== 0) {
            var dx = this.speed * Math.cos(this.anglez);
            var dy = this.speed * Math.sin(this.anglez);
            if (this.wheelAngle !== 0) {
                var s = Math.cos(this.wheelAngle);
                dx *= s; // 转换到前驱
                dy *= s;
                this.anglez += s * this.speed / l2 * Math.tan(this.wheelAngle);
                //this.sin = Math.sin(this.anglez);
                //this.cos = Math.cos(this.anglez);
            }
            this.x += dx;
            this.y += dy;
        }

        draw();
    }
}
